import axios from 'axios'
import { ElLoading, ElMessage } from 'element-plus'

import log from 'electron-log/renderer';


//axios初始化
const instance = axios.create({
    // baseURL: '/api',
    //https://ysd.yishoudian.com
    // http://39.101.143.18:8081
    // http://192.168.22.208:8081 
    //http://39.101.143.18:8081
    //https://ysd.yishoudian.com
    //http://127.0.0.1:8081
    //baseURL: 'https://ysd.yishoudian.com',
    baseURL: 'https://ysd.yishoudian.com',
    timeout: 20000,
    headers: {
        'Content-Type': 'application/json;charset=UTF-8',
    },
})

let loadingOptions = {
    customClass: 'my-loading',
    lock: true,
    text: '拼命加载中...',
    background: 'rgba(0, 0, 0, 0.4)',
}
let loadingCount = 0
let loadingInstance

/**
 * 请求拦截配置
 * 
 * */
const requestConf = (config) => {

    //console.log(config)
   // console.log(loadingCount)
    loadingCount++;
   // console.log(loadingCount)
    if (!loadingInstance) { // 避免重复创建加载指示器
        loadingInstance = ElLoading.service(loadingOptions);
    }

    //!config.noLoading && (loadingInstance = Vue.prototype.$baseLoading())

    if(config.url!='/auth/userlogin'){
        const token = localStorage.getItem('token')
        if (token) config.headers['Authorization'] = `Bearer ${token}`
    }
    

    return config
}

/**
 *  axios请求拦截器
 */
instance.interceptors.request.use(requestConf, (error) => {
    loadingCount--;
   // console.log(loadingCount)
    checkAndCloseLoading();
    return Promise.reject(error)
})

/**
 * 响应拦截器
 * 
 * */
const handleData = async (res) => {
   // console.log(res)
    const {
        data,
    } = res
   // console.log(loadingCount)
    loadingCount--;
//console.log(loadingCount)
    checkAndCloseLoading();



    let code = data && data['code'];
    if (code == 0) {
        return data
    } else {

        // 记录错误日志
        const { config } = res; // 获取请求配置
        const logData = {
            timestamp: new Date().getTime(), // 当前时间戳
            url: config.url, // 请求 URL
            method: config.method, // 请求方法
            params: config.params ? JSON.stringify(config.params) : '', // 请求参数
            data: config.data ? JSON.stringify(config.data) : '', // 请求体数据
            response: data ? JSON.stringify(data) : '', // 响应数据
        };

        // 记录错误日志
        log.error(logData)

        let errMsg = data.msg ? data.msg : '接口错误';
        ElMessage({
            message: errMsg,
            type: 'warning',
        })

        // 创建一个 Error 对象，并将 data 附加到它上面
        const error = new Error(errMsg);
        return Promise.reject(error)
    }


}

/**
* @description axios响应拦截器
*/
instance.interceptors.response.use(
    (response) => handleData(response),
    (error) => {
      //  console.log(loadingCount)
        loadingCount--;
       // console.log(loadingCount)
        checkAndCloseLoading();
        //超时
        if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
            ElMessage({
                message: '响应超时,请稍后重试',
                type: 'warning',
            })

        } else {
           console.log(error)
           if(!error.response){ //请求可能根本就没有发出
            ElMessage({
                message: '网络不稳定，请检查您的网络连接',
                type: 'warning',
            })
           }else{
            ElMessage({
                message: error,
                type: 'warning',
            })
           }
  

            // 记录错误日志
            const { config, response } = error; // 获取请求配置
            const logData = {
                timestamp: new Date().getTime(), // 当前时间戳
                url: config.url, // 请求 URL
                method: config.method, // 请求方法
                params: config.params ? JSON.stringify(config.params) : '', // 请求参数
                data: config.data ? JSON.stringify(config.data) : '', // 请求体数据
                response: response.data ? JSON.stringify(response.data) : '', // 响应数据
            };

            // 记录错误日志
            log.error(logData)



        }


        return Promise.reject(error);
    }
)

function checkAndCloseLoading() {
    if (loadingCount <= 0 && loadingInstance) {
        loadingInstance.close();
        loadingInstance = null; // 清空加载实例引用
    }
}
export default instance